home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 051-060 / amok59 / menu / menu.liesmich next >
Text File  |  1993-11-04  |  5KB  |  189 lines

  1.  
  2.                Menu.mod
  3.             ==============
  4.  
  5.  
  6. Dieses Modul vereinfacht das Erstellen von Menüs in eigenen Programmen.
  7. Es untersützt KickStart 1.3 und 2.0, kann beliebige Zeichensätze (auch
  8. proportionale) verarbeiten und kreiert bei zu kleinem Bildschirm oder
  9. zu großem Zeichensatz bei Bedarf automatisch zweispaltige Menüs.
  10.  
  11.  
  12. Benutzung:
  13.  
  14.  
  15.   Um die von Menu.mod erzeugte Menüstruktur zu speichern, muß man sich
  16.   zunächst eine Variable deklarieren:
  17.  
  18.     VAR
  19.       menu: Intuition.MenuPtr;
  20.  
  21.  
  22.   Nun muß zunächst ein Fenster geöffnet werden, das mit dem Menü versehen
  23.   werden soll (es können später auch mehrere Fenster, die auf dem selben
  24.   Screen geöffnet wurden, mit dem selben Menü gleichzeitig arbeiten).
  25.  
  26.     window := I.OpenWindow(...);
  27.  
  28.  
  29.   Nun kann das Erzeugen des Menüs gestartet werden:
  30.  
  31.     Menu.StartMenu(window);
  32.  
  33.  
  34.   Nun werden nacheinander die Menüstreifen festgelegt. Dazu ruft man
  35.   zunächst
  36.  
  37.     Menu.NewMenu("Project");
  38.  
  39.   auf. In diesem Fall ist das erste Menü das Project Menu.
  40.  
  41.  
  42.   Jetzt werden nacheinander die Items erzeugt. Dazu gibt es verschiedene
  43.   Möglichkeiten:
  44.  
  45.  
  46.     Menu.NewItem("Open","O");
  47.  
  48.   Hier wird ein gewöhnliches Item mit dem Namen 'Open' under dem Keyboard-
  49.   Shortcut Amiga+'O' erzeugt.
  50.  
  51.  
  52.     Menu.NewItem("About",0X);
  53.  
  54.   So wird ein Item ohne Keyboard-Shortcut erzeugt.
  55.  
  56.  
  57.     Menu.NewItem2("Quit","^Q");
  58.  
  59.   Dieser Aufruf erzeugt ein Item mit dem Namen 'Quit'. Rechtsbündig wird in
  60.   diesem Menüpunkt zusätzlich '^Q' dargestellt. Dies ist gedacht für den
  61.   Tastatur-Abkürzung Control+'Q'. Solche Abkürzungen werden von Intuition
  62.   nicht automatisch verwaltet und müssen im eigenen Programm selbst 
  63.   überprüft werden (siehe Test.mod).
  64.  
  65.  
  66.     Menu.NewItemChecked("Save Icons","I",TRUE);
  67.  
  68.   Es wird ein Item wie mit NewItem() mit den Namen 'Save Icons' und der
  69.   Abkürzung Amiga+'I' erzeugt. Auch hier kann statt "I" 0X angegeben werden,
  70.   um keine Abkürzung zuzulassen. Zusätzlich bekommt dieses Item ein Häkchen
  71.   (CheckMark). Der letzte Parameter gibt an, ob dieses Häkchen zu beginn
  72.   gesetzt (TRUE) oder nicht gesetzt (FALSE) sein soll.
  73.  
  74.  
  75.     Menu.NewItem2Checked("Auto Save all 10 minutes","^A",FALSE);
  76.  
  77.   Hier wird, ähnlich NewItem2() der Text "^A" rechtsbündig im Menü 
  78.   dargestellt. Ansonsten erzeugt NewItem2Checked() das gleiche Menü wie 
  79.   NewItemChecked().
  80.  
  81.  
  82.     Menu.Seperator;
  83.  
  84.   Dieser Aufruf erzeugt eine horizontale Zick-Zack-Linie, mit der mehrere
  85.   Menüpunkte Gruppiert werden können. Intern ist diese Linie ein deaktiviertes
  86.   MenuItem, so daß für diese Linie eine Menünummer verbraucht wird (Das wird
  87.   beim interpretieren von IntuiMessages vom Typ MenuPick wichtig, siehe
  88.   Test.mod).
  89.  
  90.  
  91.   Die letzten 5 Prozeduren können nun beliebig oft nacheinander aufgerufen
  92.   werden. Danach können weitere Menüstreifen mit NewMenu() etc. nach dem
  93.   gleichen Schema erzeugt werden.
  94.  
  95.  
  96.   Das Erzeugen des Menüs wird mit
  97.  
  98.     menu := Menu.EndMenu();
  99.  
  100.   abgeschlossen.
  101.  
  102.  
  103.   Um dieses Menü jetzt zu benutzen, wird es mit
  104.  
  105.     IF Intuition.SetMenuStrip(window,menu^) THEN ...
  106.  
  107.   an das Fenster gebunden.
  108.  
  109.  
  110.   Eingaben über dieses Menü können wie gewohnt als IntuiMessages vom userPort
  111.   des Fensters gelesen werden.
  112.  
  113.   Die Menünummern werden folgendermaßen verteilt:
  114.  
  115.     MenuNum: 1. Streifen: 0
  116.              2. Streifen: 1
  117.              3. Streifen: 2 etc.
  118.  
  119.     ItemNum: 1. Item: 0
  120.              2. Item: 1
  121.              3. Item: 3 etc.
  122.  
  123.     Zu beachten ist bei den Items, daß ein Seperator auch als Item zählt. So
  124.     hat folgendes Menü folgende Nummern:
  125.  
  126.         Project        MenuNum  ItemNum
  127.           Open   O       0        0
  128.           Close  C       0        1
  129.           --------
  130.           Quit   Q       0        3
  131.  
  132.  
  133.   Wird das Menü nicht mehr benötigt, kann es mit
  134.  
  135.     Intuition.ClearMenuStrip(window);
  136.     Menu.DisposeMenu(menu);
  137.  
  138.   vom Fenster gelöst und der benötigte Speicher freigegeben werden. Dies ist
  139.   jedoch gewöhnlich nicht nötig, da der Speicher bei Programmende automatisch
  140.   freigegeben wird.
  141.  
  142.  
  143. Speicher:
  144.  
  145.   Wie dem aufmerksamen Programmierer vielleicht aufgefallen ist, können die
  146.   gesamten Prozeduren von Menu.mod nicht fehlschlagen und nirgends ist eine
  147.   Abfrage nötig, ob z.B. genügend Speicher vorhanden war.
  148.  
  149.   Ist nicht genügend Speicher vorhanden, bricht Menu.mod einfach mit HALT(20)
  150.   ab. Ist dies nicht gewünscht, kann man sich selbst einen Speichermangel-
  151.   Handler schreiben, der z.B. folgendermaßen aussieht:
  152.  
  153.  
  154.   Diese Prozedur kann natürlich bei bestimmten Anwendungen noch sehr viel
  155.   Intelligenter gestaltet werden, so daß sie z.B. nicht unbedingt benötigten
  156.   Speicher freigibt.
  157.  
  158.   Menu.mod muß nur noch mitgeteilt werden, daß diese Prozedur bei Speicher-
  159.   mangel aufgerufen werden soll:
  160.  
  161.     Menu.oom := OutOfMem;
  162.  
  163.   Zu beachten ist, daß diese Prozedur auf jeden Fall eine Möglichkeit vorsehen
  164.   sollte, daß Programm abzubrechen, da sich das Programm sonst bei Speicher-
  165.   mangel in eine Endlosschleife verrent. Also NICHT:
  166.  
  167.     PROCEDURE * OutOfMem;
  168.     BEGIN
  169.       IF MyPtr#NIL THEN DISPOSE(MyPtr) END;
  170.     END OutOfMem;
  171.  
  172.   sondern:
  173.  
  174.     PROCEDURE * OutOfMem;
  175.     BEGIN
  176.       IF MyPtr#NIL THEN DISPOSE(MyPtr) ELSE HALT(20) END;
  177.     END OutOfMem;
  178.  
  179.   Bei diesem Beispiel wird beim ersten Aufruf von OutOfMem evtl. Speicher
  180.   freigegeben. war dies jedoch nicht genugt, wird beim zweiten Aufruf das
  181.   Programm abgebrochen.
  182.  
  183.  
  184. Viel Spaß!
  185.  
  186.  
  187. --- Fridtjof.
  188.  
  189.